package decorate;


/**
 * 装饰模式
 * 介绍
 * 意图：动态地给一个对象添加一些额外的职责。就增加功能来说，装饰器模式相比生成子类更为灵活。
 * 主要解决：一般的，我们为了扩展一个类经常使用继承方式实现，由于继承为类引入静态特征，并且随着扩展功能的增多，子类会很膨胀。
 * 何时使用：在不想增加很多子类的情况下扩展类。
 * 如何解决：将具体功能职责划分，同时继承装饰者模式。
 * 关键代码： 1、Component 类充当抽象角色，不应该具体实现。 2、修饰类引用和继承 Component 类，具体扩展类重写父类方法。
 * 应用实例： 1、孙悟空有 72 变，当他变成"庙宇"后，他的根本还是一只猴子，但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上，但是通常都是有画框的，并且实际上是画框被挂在墙上。在挂在墙上之前，画可以被蒙上玻璃，装到框子里；这时画、玻璃和画框形成了一个物体。
 * 优点：装饰类和被装饰类可以独立发展，不会相互耦合，装饰模式是继承的一个替代模式，装饰模式可以动态扩展一个实现类的功能。
 * 缺点：多层装饰比较复杂。
 * 使用场景： 1、扩展一个类的功能。 2、动态增加功能，动态撤销。
 * 注意事项：可代替继承。
 * 
 * 客户端：召唤师
 * 
 * 英雄接口： Hero（学习技能的接口）	
 * 具体的英雄：BlindMonk（高层模块）				技能栏类：Skills public Skills(Hero hero)（底层模块）
 *  public BlindMonk(String name)			技能类（继承技能栏的具体技能类）：Skill_Q	Skill_W		Skill_E		Skill_R	
 * 											技能类的构造方法是Skill_?(Hero hero,String skillName)调上层hero,并将第二个具体的参数给自身私有变量
 * 											实现	learnSkills方法，在进行自身具体逻辑后，调用上层super.learnSkills()只到高层模块的learnSkills实现
 * 总结：整理出具体的需求，如一幅画怎么挂在墙上，可整理出挂画的接口，一个具体画的类，一个怎么挂画操作的类，通过在挂画操作子类里面进行各种设计，
 * 最后在挂画实现方法里面通过super.调用上层方法直到具体画的方法里面
 * 重点，如何将接口传递下去并且通过super将高层和底层逻辑连接起来
 * 
 * 
 */

public class Player {
    public static void main(String[] args) {
        //选择英雄
        Hero hero = new BlindMonk("李青");
        
        Skills skills = new Skills(hero);
        Skills r = new Skill_R(skills,"猛龙摆尾");
        Skills e = new Skill_E(r,"天雷破/摧筋断骨");
        Skills w = new Skill_W(e,"金钟罩/铁布衫");
        Skills k = new Skill_W(w,"金钟罩/绝地反击");
        Skills q = new Skill_Q(k,"天音波/回音击");
        //学习技能
        q.learnSkills();
    }
}
